package com.example.memento.model;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;

import java.util.Map;

/**
 * 词典统计信息
 * 提供词典数据的统计信息
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@JsonIgnoreProperties(ignoreUnknown = true)
public class DictionaryStats {
    
    /**
     * 总词条数
     */
    private Long totalWords;
    
    /**
     * 按来源统计的词条数
     */
    private Map<String, Long> wordsBySource;
    
    /**
     * 按语言统计的词条数
     */
    private Map<String, Long> wordsByLanguage;
    
    /**
     * 按目标语言统计的词条数
     */
    private Map<String, Long> wordsByTargetLanguage;
    
    /**
     * 最近更新时间
     */
    private String lastUpdated;
    
    /**
     * 数据库大小（字节）
     */
    private Long databaseSize;
    
    /**
     * 活跃词典源数量
     */
    private Integer activeSources;
    
    /**
     * 总下载任务数
     */
    private Long totalDownloadTasks;
    
    /**
     * 成功的下载任务数
     */
    private Long successfulDownloadTasks;
    
    /**
     * 失败的下载任务数
     */
    private Long failedDownloadTasks;
    
    /**
     * 计算成功率
     */
    public Double getSuccessRate() {
        if (totalDownloadTasks == null || totalDownloadTasks == 0) {
            return 0.0;
        }
        return (successfulDownloadTasks != null ? successfulDownloadTasks : 0) * 100.0 / totalDownloadTasks;
    }
    
    /**
     * 计算失败率
     */
    public Double getFailureRate() {
        if (totalDownloadTasks == null || totalDownloadTasks == 0) {
            return 0.0;
        }
        return (failedDownloadTasks != null ? failedDownloadTasks : 0) * 100.0 / totalDownloadTasks;
    }
    
    /**
     * 获取格式化的数据库大小
     */
    public String getFormattedDatabaseSize() {
        if (databaseSize == null) {
            return "未知";
        }
        
        if (databaseSize < 1024) {
            return databaseSize + " B";
        } else if (databaseSize < 1024 * 1024) {
            return String.format("%.1f KB", databaseSize / 1024.0);
        } else if (databaseSize < 1024 * 1024 * 1024) {
            return String.format("%.1f MB", databaseSize / (1024.0 * 1024.0));
        } else {
            return String.format("%.1f GB", databaseSize / (1024.0 * 1024.0 * 1024.0));
        }
    }
}